/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bddfirstproject.controller;

import bddfirstproject.AccesBD;
import bddfirstproject.model.Theme;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author epulapp
 */
public class ThemeDAL {
    
    public static AccesBD accesBD;
    public static AccesBD getAccesBD() {
        if(accesBD == null) {
            accesBD = new AccesBD();
        }
        return accesBD;
    }
    
    public static void ajouterTheme(Theme theme) {
        try {
            // Chargement des parametres de connexion
            AccesBD connect = getAccesBD();
            //Connexion à la base
            connect.openConnection();
            
            //On appelle la procédure stockée osus ORACLE NOUVEL_AUTEUR
            CallableStatement themeInsert = connect.getConnect().prepareCall("{ call NOUVEAU_THEME(?, ?) }");           
            themeInsert.setInt(1,theme.getIdChefRedactionTheme());
            themeInsert.setString(2,theme.getTitreTheme());
            themeInsert.execute();        
            connect.getConnect().commit();       
            System.out.println("Le thème '" + theme.getTitreTheme() + "' a été inséré dans la base ORACLE");    

            //Fermeture de la connexion
            connect.closeConnection();
            
        } catch(IOException e1) {
            System.err.println("Erreur, configuration de la base erronée - " + e1);
        } catch(SQLException e2) {
            System.err.println("Erreur execution requete code (" + e2.getErrorCode() + ")");
        } catch(Exception e3) {
            System.err.println("Erreur, connexion à la base impossible - " + e3);
        }
    }
    
    public static ArrayList<Theme> getAllThemes() {
        // Creation de l'objet ArrayList de retour
        ArrayList<Theme> result = new ArrayList<Theme>();
        
        try {
            // Chargement des parametres de connexion
            AccesBD connect = getAccesBD();
            //Connexion à la base
            connect.openConnection();
            
            //On appelle la procédure stockée osus ORACLE NOUVEL_AUTEUR    
            Statement themeListStatement    = connect.getConnect().createStatement();
            ResultSet resultSet             = themeListStatement.executeQuery("SELECT THEME.id_theme, THEME.chef_redaction, THEME.titre, count(id_partie) "
                                                                            + " FROM THEME "
                                                                            + " INNER JOIN PARTIE_REDACTION ON THEME.id_theme=PARTIE_REDACTION.id_theme "
                                                                            + " WHERE inclus_dans is null "
                                                                            + " GROUP BY THEME.id_theme, THEME.chef_redaction, THEME.titre ");
            
            // Gestion du resultat
            while(resultSet.next()) {
                result.add(new Theme(resultSet.getInt(1), resultSet.getInt(2), resultSet.getString(3), resultSet.getInt(4)));
            }
            System.out.println("Chargement de " + result.size() + " themes");
            
            //Fermeture de la connexion
            connect.closeConnection();
            
        } catch(IOException e1) {
            System.err.println("Erreur, configuration de la base erronée - " + e1);
        } catch(SQLException e2) {
            System.err.println("Erreur execution requete code (" + e2.getErrorCode() + ")");
        } catch(Exception e3) {
            System.err.println("Erreur, connexion à la base impossible - " + e3);
        }
        
        return result;
    }
    
    public static Theme getTheme(int id_theme) {
        Theme currentTheme = new Theme();
        try {
            // Chargement des parametres de connexion
            AccesBD connect = getAccesBD();
            //Connexion à la base
            connect.openConnection();
            
            //On appelle la procédure stockée osus ORACLE NOUVEL_AUTEUR    
            Statement themeListStatement    = connect.getConnect().createStatement();
            ResultSet resultSet             = themeListStatement.executeQuery("SELECT THEME.id_theme, THEME.chef_redaction, THEME.titre, count(id_partie) "
                                                                            + " FROM THEME "
                                                                            + " INNER JOIN PARTIE_REDACTION ON THEME.id_theme=PARTIE_REDACTION.id_theme "
                                                                            + " WHERE inclus_dans is null AND THEME.id_theme = " + id_theme
                                                                            + " GROUP BY THEME.id_theme, THEME.chef_redaction, THEME.titre ");
            
            // Gestion du resultat
            if(resultSet.next()) {
                currentTheme = new Theme(resultSet.getInt(1), resultSet.getInt(2), resultSet.getString(3), resultSet.getInt(4));
                System.out.println("Chargement du theme " + currentTheme.toString());
                connect.closeConnection();
            } else {
                connect.closeConnection();
                throw new Exception("Aucun theme ne correspond à cet identifiant");
            }
        } catch(IOException e1) {
            System.err.println("Erreur, configuration de la base erronée - " + e1);
        } catch(SQLException e2) {
            System.err.println("Erreur execution requete code (" + e2.getErrorCode() + ")");
        } catch(Exception e3) {
            System.err.println("Erreur, connexion à la base impossible - " + e3);
        }
        return currentTheme;
    }
}
